/**
 * 微信登录工具类
 * 封装微信登录相关功能
 */

import storage from './storage.js';
import request from './request.js';

export {
  getUserInfo,
  setUserInfo,
  login,
  isLoggedIn,
  getToken,
  setToken,
  clearLoginInfo
};

// 用户信息存储键
const USER_INFO_KEY = 'user_info';
const TOKEN_KEY = 'token';

/**
 * 判断用户是否已登录
 * @returns {Boolean} - 是否已登录
 */
const isLoggedIn = () => {
  return !!getToken();
};

/**
 * 获取用户Token
 * @returns {String|null} - 用户Token或null
 */
const getToken = () => {
  return storage.get(TOKEN_KEY);
};

/**
 * 设置用户Token
 * @param {String} token - 用户Token
 */
const setToken = (token) => {
  storage.set(TOKEN_KEY, token);
};

/**
 * 获取用户信息
 * @returns {Object|null} - 用户信息或null
 */
const getUserInfo = () => {
  return storage.get(USER_INFO_KEY);
};

/**
 * 设置用户信息
 * @param {Object} userInfo - 用户信息
 */
const setUserInfo = (userInfo) => {
  storage.set(USER_INFO_KEY, userInfo);
};

/**
 * 清除登录信息
 */
const clearLoginInfo = () => {
  storage.remove(TOKEN_KEY);
  storage.remove(USER_INFO_KEY);
};

/**
 * 静默登录 - 不显示任何提示，适用于扫码场景
 * @param {Function} success - 登录成功回调
 * @param {Function} fail - 登录失败回调
 * @returns {Promise} - 返回Promise对象
 */
const silentLogin = (success, fail) => {
  return new Promise((resolve, reject) => {
    // 判断是否已登录
    if (isLoggedIn()) {
      const userInfo = getUserInfo();
      typeof success === 'function' && success(userInfo);
      resolve(userInfo);
      return;
    }
    
    // 静默调用微信登录接口
    uni.login({
      provider: 'weixin',
      success: (loginRes) => {
        if (loginRes.code) {
          // 调用后端接口，用code换取登录凭证
          request.post('/api/v2/auth/openId', {
            code: loginRes.code
          }).then(res => {
            const { accessToken, expires } = res.data;
            
            // 存储token信息
      
            uni.setStorageSync('token', accessToken);
            uni.setStorageSync('tokenExpires', expires);
            
            // 静默获取用户信息
            uni.getUserInfo({
              provider: 'weixin',
              success: (infoRes) => {
                const userInfo = infoRes.userInfo;
                setUserInfo(userInfo);
                
                // 调用成功回调
                typeof success === 'function' && success(userInfo);
                resolve(userInfo);
              },
              fail: (err) => {
                console.error('静默获取用户信息失败', err);
                typeof fail === 'function' && fail(err);
                reject(err);
              }
            });
          }).catch(err => {
            console.error('静默登录失败', err);
            typeof fail === 'function' && fail(err);
            reject(err);
          });
        } else {
          console.error('微信静默登录失败', loginRes);
          typeof fail === 'function' && fail(loginRes);
          reject(loginRes);
        }
      },
      fail: (err) => {
        console.error('微信静默登录失败', err);
        typeof fail === 'function' && fail(err);
        reject(err);
      }
    });
  });
};

/**
 * 退出登录
 * @param {Function} callback - 退出登录后的回调
 */
const logout = (callback) => {
  uni.showModal({
    title: '提示',
    content: '确定要退出登录吗？',
    success: (res) => {
      if (res.confirm) {
        // 清除登录信息
        clearLoginInfo();
        
        // 显示提示
        uni.showToast({
          title: '已退出登录',
          icon: 'success'
        });
        
        // 调用回调
        typeof callback === 'function' && callback();
      }
    }
  });
};

/**
 * 检查登录状态，未登录则弹出登录框
 * @param {Function} callback - 登录成功后的回调
 * @returns {Boolean} - 是否已登录
 */
const checkLogin = (callback) => {
  if (isLoggedIn()) {
    typeof callback === 'function' && callback(getUserInfo());
    return true;
  } else {
    showLoginModal(callback);
    return false;
  }
};

/**
 * 显示登录弹窗
 * @param {Function} callback - 登录成功后的回调
 */
const showLoginModal = (callback) => {
  uni.showModal({
    title: '提示',
    content: '请先登录后再操作',
    confirmText: '去登录',
    cancelText: '取消',
    success: (res) => {
      if (res.confirm) {
        login((userInfo) => {
          uni.showToast({
            title: '登录成功',
            icon: 'success'
          });
          typeof callback === 'function' && callback(userInfo);
        });
      }
    }
  });
};

export default {
  silentLogin,
  logout,
  isLoggedIn,
  getToken,
  setToken,
  getUserInfo,
  setUserInfo,
  clearLoginInfo,
  checkLogin,
  showLoginModal
}
